package com.xm.queue.task;

/**
 * 测试并发情况，生产限流与消费限流
 * 18:54:31.970 [main] INFO com.xm.queue.task.TaskUtil - 工人[0]已上线，正在加班加点工作。。
 * 18:54:31.987 [main] INFO com.xm.queue.task.TaskUtil - 工人[1]已上线，正在加班加点工作。。
 * 18:54:31.988 [main] INFO com.xm.queue.task.TaskUtil - 工人[2]已上线，正在加班加点工作。。
 * 18:54:31.988 [main] INFO com.xm.queue.task.TaskUtil - 工人[3]已上线，正在加班加点工作。。
 * 18:54:31.988 [main] INFO com.xm.queue.task.TaskUtil - 工人[4]已上线，正在加班加点工作。。
 * 18:54:31.989 [main] INFO com.xm.queue.task.TaskUtil - 工人[5]已上线，正在加班加点工作。。
 * 18:54:31.989 [main] INFO com.xm.queue.task.TaskUtil - 工人[6]已上线，正在加班加点工作。。
 * 18:54:31.989 [main] INFO com.xm.queue.task.TaskUtil - 工人[7]已上线，正在加班加点工作。。
 * 18:54:31.990 [main] INFO com.xm.queue.task.Consumer - 消费者工人初始化完成
 * Progress：100/100
 * end queue size = 0
 * end predict count = 500
 * end realPutCount = 100
 * end realPollCount = 100
 * 耗时 = 7597ms
 * 18:54:39.591 [main] INFO com.xm.queue.task.TaskUtil - 正在关闭工人线程池资源。。
 * 18:54:44.595 [main] INFO com.xm.queue.task.TaskUtil - 已关闭工人线程池资源！共计接收任务500个，实际接收任务100个，实际消费任务100个
 * 18:54:44.595 [main] INFO com.xm.queue.task.TaskUtil - 已关闭任务队列资源！当前队列0个
 * 18:54:44.595 [main] INFO com.xm.queue.task.TaskUtil - 已关闭任务私信队列资源！当前死信队列0个
 * Process finished with exit code 0
 */
public class TestTask {
    public static void main(String[] args) {
        // 按电脑配置初始化消费者工人数量
        Consumer.init();

        int times = 10;
        int batch = 50;
        for (int i = 0; i < times; i++) {
            try {
                new Thread(() -> {
                    Producer.make(batch);
                }).start();

//                Producer.make(50);
//                System.out.println("------------------------- " + i);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }

        // 模拟消费进度
        long start = System.currentTimeMillis();
        int realPollCount;
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            try {
                Thread.sleep(10L);
                realPollCount = TaskUtil.realPollCount.intValue();
                // 使用 \r 覆盖当前行，不换行
                System.out.printf("\rProgress：%d/%d", realPollCount, TaskUtil.LIMIT);
//                System.out.println("size = " + TaskUtil.QUEUE.size());

                if(TaskUtil.count() == times*batch && TaskUtil.QUEUE.isEmpty() && realPollCount == TaskUtil.LIMIT) {
                    System.out.println();
                    break;
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }

        System.out.println("end queue size = " + TaskUtil.QUEUE.size());
        System.out.println("end predict count = " + TaskUtil.count());
        System.out.println("end realPutCount = " + TaskUtil.realPutCount.intValue());
        System.out.println("end realPollCount = " + TaskUtil.realPollCount.intValue());
        System.out.println("耗时 = " + (System.currentTimeMillis() - start) + "ms");
        // 关闭线程池
        TaskUtil.shutDown();
    }
}
